/**
 * @author VernHe
 * @date 2021年06月21日 19:03
 *
 * 在一个由 '0' 和 '1' 组成的二维矩阵内，找到只包含 '1' 的最大正方形，并返回其面积。
 */
public class Solution_0221 {
    public int maximalSquare(char[][] matrix) {
        //参数判断
        if (null == matrix || matrix.length == 0) {
            return 0;
        }
        //变量定义，记录最长的边长
        int maxSide = 0;
        //初始化dp数组，dp[i][j]表示以第i-1行第j-1列结尾的最大正方形的边长,(i和j表示下标)
        //动态转移方程 dp[i][j] = min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1]) + 1
        int[][] dp = new int[matrix.length][matrix[0].length];
        //初始化
        for (int i = 0; i < matrix.length; i++) {
            dp[i][0] = matrix[i][0] == '0' ? 0 : 1;
            maxSide = Math.max(maxSide,dp[i][0]);
        }
        for (int i = 0; i < matrix[0].length; i++) {
            dp[0][i] = matrix[0][i] == '0' ? 0 : 1;
            maxSide = Math.max(maxSide,dp[0][i]);
        }
        //循环找最值，从1开始
        for (int i = 1; i < matrix.length; i++) {
            for (int j = 1; j < matrix[0].length; j++) {
                if(matrix[i][j] == '1') {
                    dp[i][j] = Math.min(dp[i-1][j-1],Math.min(dp[i-1][j],dp[i][j-1])) + 1;
                    maxSide = Math.max(maxSide,dp[i][j]);
                }
            }
        }
        int result = maxSide * maxSide;
        return result;
    }
}
